package com.neo.design.chain;

/**
 * 链式业务处理节点标识<p/>
 * 该标识仅用于业务上下文组装的识别，故每个业务推荐都基于此标识类继承一个自己的业务标识基类
 * 比如{@link com.neo.design.chain.approve.ApproveHandler}<p/>
 * 然后根据业务的拆分，依托于基类实现每个链路节点的业务处理，比如：{@link com.neo.design.chain.approve.DirectorApproveHandler}<p>
 * 如果该业务有新的链路节点，则实现自己的业务标识基类，不用更改其他代码，彻底的进行代码解耦
 *
 * @param <T> 业务请求参数 {@link ChainRequest}
 * @param <R> 业务处理结果 {@link ChainResult}
 * @author kevin
 */
public interface ChainHandler<T extends ChainRequest, R extends ChainResult> {

    /**
     * 每一层业务代码执行逻辑
     *
     * @param request 业务请求参数 {@link ChainRequest}
     * @return 处理结果 {@link ChainResult}
     */
    R handleRequest(T request);

    /**
     * 设置下一层业务处理节点
     *
     * @param next 下一层业务处理节点 {@link ChainHandler}
     */
    void setNext(ChainHandler<T, R> next);

}
